package com.jsejtman.gastos.service.impl;

import org.apache.log4j.Logger;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.jsejtman.gastos.persistence.dao.DaoException;
import com.jsejtman.gastos.persistence.dao.LugarDao;
import com.jsejtman.gastos.persistence.entity.Lugar;
import com.jsejtman.gastos.service.definition.BaseService;
import com.jsejtman.gastos.service.exception.ServiceException;

/**
 * Servicio que permite realizar operaciones con una entidad de datos Lugar.
 * 
 * @author jsejtman
 */
@Service
@Transactional
public class LugarService extends BaseService implements ILugarService {

	/**
	 * Logger de la aplicación.
	 */
	private static final Logger LOGGER = Logger.getLogger(LugarService.class);

	/**
	 * Obtiene una entidad de datos Lugar a través de su identificador.
	 * 
	 * @param id Identificador de la entidad.
	 * @return Entidad de datos Lugar hallada.
	 * @throws ServiceException En caso de problemas.
	 */
	public final Lugar getLugarById(final Long id) throws ServiceException {

		if (id == null) {
			throw new ServiceException("El identificador de categoría no fue especificado.");
		}
		try {
			final LugarDao dao = this.getDaoFactory().newDao(LugarDao.class);

			return (dao.get(Lugar.class, id));

		} catch (final DaoException e) {
			final String mensajeError =
			        "Error al obtener " + Lugar.class.getName() + " con ID = " + id;

			LugarService.LOGGER.error(mensajeError, e);

			throw new ServiceException(mensajeError, e);
		}
	}

	/**

	/**
	 * Graba o actualiza el lugar pasado.
	 * 
	 * @param lugar el lugar a grabar.
	 * @throws ServiceException en caso de problemas
	 */
	public final void saveLugar(final Lugar lugar) throws ServiceException {

		if (lugar == null) {
			throw new ServiceException("La lugar no fue especificada.");
		}
		try {
			final LugarDao entityDao = this.getDaoFactory().newDao(LugarDao.class);

			entityDao.saveOrUpdate(lugar);

		} catch (final DaoException e) {
			final String mensajeError =
			        "Error al grabar " + Lugar.class.getName() + " lugar = " + lugar;

			LugarService.LOGGER.error(mensajeError, e);

			throw new ServiceException(mensajeError, e);
		}

	}

	/**
	 * Borra un lugar.
	 * 
	 * @param lugar la lugar a borrar
	 * @throws ServiceException si ocurre un error.
	 */
	public final void deleteLugar(final Lugar lugar) throws ServiceException {

		if (lugar == null) {
			throw new ServiceException("La ategoria no fue especificada.");
		}
		try {
			final LugarDao lugarDao = this.getDaoFactory().newDao(LugarDao.class);

			lugarDao.delete(lugar);

		} catch (final DaoException e) {
			final String mensajeError =
			        "Error al borrar " + Lugar.class.getName() + " lugar = " + lugar;

			LugarService.LOGGER.error(mensajeError, e);

			throw new ServiceException(mensajeError, e);
		}
	}

}
